"""
命令行参数解析模块

该模块负责处理数据库备份工具的命令行参数解析，
包括创建解析器、添加子命令和参数定义等功能。
"""

import argparse
import sys
from typing import List, Optional


class ArgumentParser:
    """命令行参数解析器类"""
    
    def __init__(self):
        """初始化参数解析器"""
        self.parser = self._create_parser()
    
    def _create_parser(self) -> argparse.ArgumentParser:
        """创建命令行参数解析器
        
        返回:
            argparse.ArgumentParser: 参数解析器实例
                示例值: <ArgumentParser object at 0x...>
        """
        parser = argparse.ArgumentParser(
            description="数据库备份工具 - 支持MySQL、MariaDB、PostgreSQL",
            epilog="示例用法: dbbackup backup --config-dir ./configs\n示例用法: dbbackup generate-config --type mysql --output mysql_backup.toml"
        )
        
        # 添加子命令
        subparsers = parser.add_subparsers(
            dest='command',
            help='选择要执行的操作'
        )
        
        # 备份命令
        self._add_backup_commands(subparsers)
        
        # 配置命令
        self._add_config_commands(subparsers)
        
        # 通用参数
        parser.add_argument(
            '--verbose', '-v',
            action='store_true',
            help='启用详细输出模式'
        )
        
        parser.add_argument(
            '--log-file',
            type=str,
            help='日志文件路径'
        )
        
        # 主程序配置参数
        parser.add_argument(
            '--main-config',
            type=str,
            default='/etc/database-backup/db.toml',
            help='主程序配置文件路径 (默认: /etc/database-backup/db.toml)'
        )
        
        return parser
    
    def _add_backup_commands(self, subparsers: argparse._SubParsersAction) -> None:
        """添加备份相关的子命令
        
        参数:
            subparsers (argparse._SubParsersAction): 子命令解析器
        
        返回:
            None
        """
        # 基于配置文件的批量备份命令
        backup_parser = subparsers.add_parser(
            'backup',
            help='使用配置文件进行数据库批量备份'
        )
        self._add_backup_config_arguments(backup_parser)
    
    def _add_backup_config_arguments(self, parser: argparse.ArgumentParser) -> None:
        """添加备份配置相关的命令行参数
        
        参数:
            parser (argparse.ArgumentParser): 命令行解析器
        """
        config_group = parser.add_argument_group('配置选项')
        config_group.add_argument(
            '--config-dir',
            type=str,
            help='配置文件目录路径'
        )
        config_group.add_argument(
            '--validate-config',
            action='store_true',
            help='验证配置文件'
        )
        config_group.add_argument(
            '--from-config',
            action='store_true',
            help='从配置文件执行备份'
        )
        
        # 添加性能参数组
        performance_group = parser.add_argument_group('性能选项')
        performance_group.add_argument(
            '--max-workers',
            type=int,
            default=3,
            help='最大并行工作线程数，默认为3'
        )
    
    def _add_config_commands(self, subparsers: argparse._SubParsersAction) -> None:
        """添加配置相关的子命令
        
        参数:
            subparsers (argparse._SubParsersAction): 子命令解析器
        
        返回:
            None
        """
        # 生成配置模板命令
        config_parser = subparsers.add_parser(
            'generate-config',
            help='生成TOML配置文件模板'
        )
        
        config_parser.add_argument(
            '--output', '-o',
            type=str,
            default='backup_config.toml',
            help='配置文件输出路径 (默认: backup_config.toml)'
        )
        
        config_parser.add_argument(
            '--type',
            choices=['mysql', 'postgresql', 'mariadb'],
            default='mysql',
            help='数据库类型 (默认: mysql)'
        )
    
    def parse_args(self, args: Optional[List[str]] = None) -> argparse.Namespace:
        """解析命令行参数
        
        参数:
            args (Optional[List[str]]): 命令行参数列表，None表示使用sys.argv
                示例值: ["mysql", "--host", "localhost", "--user", "root"]
        
        返回:
            argparse.Namespace: 解析后的参数对象
                示例值: Namespace(command='mysql', host='localhost', user='root')
        """
        if args is None:
            args = sys.argv[1:]
        
        return self.parser.parse_args(args)


def create_parser() -> ArgumentParser:
    """创建参数解析器实例
    
    返回:
        ArgumentParser: 参数解析器实例
    """
    return ArgumentParser()